<?php
namespace app\common\model;

use think\Model;

class VerifyCode extends Model
{
    // 表名
    protected $name = 'verify_code';
    // 自动写入时间戳
    protected $autoWriteTimestamp = false;
    // 定义时间戳字段名
    protected $createTime = 'created_at';
    protected $updateTime = 'updated_at';

    /**
     * 发送验证码
     * @param string $phone 手机号
     * @param string $type 类型(register/login/pay_password/reset_pay_password)，默认为register
     * @return array
     */
    public function sendCode($phone, $type = 'register')
    {
        // 记录日志
        \think\Log::write("开始发送验证码: 手机号:{$phone}, 类型:{$type}", 'info');
        
        // 检查1分钟内是否已发送过验证码
        $lastCode = $this->where('phone', $phone)
                        ->where('type', $type)
                        ->where('created_at', '>', time() - 60)
                        ->find();
        if ($lastCode) {
            \think\Log::write("验证码发送频繁: 手机号:{$phone}, 类型:{$type}, 上次发送时间:{$lastCode['created_at']}", 'warning');
            return ['code' => 0, 'msg' => '验证码发送过于频繁，请1分钟后再试'];
        }

        // 生成6位验证码
        $code = mt_rand(100000, 999999);
        // 测试环境可以使用固定验证码
        if (config('app_debug')) {
            $code = "123456";
        }
        // 过期时间5分钟
        $expireTime = time() + 300;

        // 存储验证码
        $result = $this->save([
            'phone' => $phone,
            'code' => $code,
            'type' => $type,
            'expire_time' => $expireTime,
            'created_at' => time(),
            'updated_at' => time()
        ]);
        
        if (!$result) {
            \think\Log::write("验证码保存失败: 手机号:{$phone}, 类型:{$type}", 'error');
            return ['code' => 0, 'msg' => '验证码生成失败，请稍后重试'];
        }
        
        \think\Log::write("验证码生成成功: 手机号:{$phone}, 类型:{$type}, 验证码:{$code}, 过期时间:{$expireTime}", 'info');

        // 这里应该调用短信发送接口，实际项目中替换为真实的短信服务
        // $smsResult = sendSms($phone, "您的验证码是：{$code}，5分钟内有效");
        // if (!$smsResult) {
        //     return ['code' => 0, 'msg' => '短信发送失败，请稍后重试'];
        // }

        return ['code' => 1, 'msg' => '验证码发送成功', 'data' => ['expire_time' => $expireTime, 'code' => config('app_debug') ? $code : null]];
    }

    /**
     * 验证验证码
     * @param string $mobile 手机号
     * @param string $captcha 验证码
     * @param string $event 类型(register/login/pay_password/reset_pay_password)
     * @return array
     */
    public function verifyCode($mobile, $captcha, $event)
    {
        // 记录验证请求日志，方便调试
        \think\Log::write("验证码验证请求: 手机号:{$mobile}, 验证码:{$captcha}, 类型:{$event}", 'info');

        $record = $this->where('phone', $mobile)
                      ->where('type', $event)
                      ->where('code', $captcha)
                      ->order('created_at', 'desc')
                      ->find();

        if (!$record) {
            // 查询该手机号最近的验证码记录，用于调试
            $latestRecord = $this->where('phone', $mobile)
                               ->order('created_at', 'desc')
                               ->find();
            
            $errorMsg = '验证码不正确';
            if ($latestRecord) {
                $errorMsg .= '，最近的验证码类型为：' . $latestRecord['type'];
            } else {
                $errorMsg .= '，未找到该手机号的验证码记录';
            }
            
            \think\Log::write("验证码验证失败: {$errorMsg}", 'error');
            return ['code' => 0, 'msg' => $errorMsg];
        }

        if ($record['expire_time'] < time()) {
            \think\Log::write("验证码已过期: 过期时间:{$record['expire_time']}, 当前时间:" . time(), 'error');
            return ['code' => 0, 'msg' => '验证码已过期'];
        }

        // 验证成功后可以删除验证码或标记为已使用
        // $record->delete();
        \think\Log::write("验证码验证成功: 手机号:{$mobile}, 类型:{$event}", 'info');
        return ['code' => 1, 'msg' => '验证码验证成功'];
    }
}